"""

解析：
4. 一组数有两种数 出现了奇数次， 其他的出现了偶数次， 找到他们。
    参考技巧： a & (-a)  取最后位为1的位置数。
    
    
    加入说 这两个数分别为 a, b
    思路：
        1.所有数异或完：结果应该只剩 a ^ b 了， 因为其他数异或完都是0
        2. 我们取 a ^ b 结果，最后一个 1 的位置
            例如： 011010 -> 000010
            那么我们可以知道， a 或 b 在这个位置上肯定 一个为0, 一个为1， 因为 不同 异或为1 
            000010 也可以转换为数字
        3. 我们去列表中找所有这个位置为1的进行异或，可以得到， a 或 b 中一个数(这个位置为1的)
            因为其他的异或完是0，
            加入说找到的是a
        4. b =  a ^ b ^ a

示例：
1: 001
2: 010
3: 011
1: 100
[1,2,3,2,3, 4]

1. 所有数异或完结果: result = 1 ^ 4 -> 001 ^ 100 -> 101 
2. 最后一位是 1 的  -> 001 -> 10进制数字1
3. 找所有这一位为 1 的数异或
    找到数字: 1 和 3 
    异或： 1 ^ 3 ^ 3 = 1
    a = 1 = 001
4. 求 b
    b = result ^ a = 1 ^ 4 ^ 1 = 4
5. 至此两个数都找到了

"""


# 代码实现
arr = [4,5,6,7,8,9,4,5,6,7]
def search_data(arr: list):
    # 记录所有异或结果
    err: int = 0
    for i in arr:
        err = err ^ i

    # 求最后一为1 的
    end1 = err & (-err)

    # 找a， 假设a是最后位置为1的
    a: int = 0
    for i in arr:
        if i & (-i) == end1:
            a = a ^ i
    # 找b
    b: int = err ^ a

    print(a, b)     

search_data(arr)